package cc.blynk.server.notifications.mail; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.mail.*; import javax.mail.internet.*; import javax.mail.util.ByteArrayDataSource; import java.util.Properties; /** * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 14.09.16. */ public class GMailClient implements MailClient { private static final Logger log = LogManager.getLogger(MailWrapper.class); private final Session session; private final InternetAddress from; public GMailClient(Properties mailProperties) { final String username = mailProperties.getProperty("mail.smtp.username"); final String password = mailProperties.getProperty("mail.smtp.password"); log.info("Initializing gmail smtp mail transport. Username : {}. SMTP host : {}:{}", username, mailProperties.getProperty("mail.smtp.host"), mailProperties.getProperty("mail.smtp.port")); this.session = Session.getInstance(mailProperties, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { this.from = new InternetAddress(username); } catch (AddressException e) { throw new RuntimeException("Error initializing MailWrapper." + e.getMessage()); } } @Override public void sendText(String to, String subj, String body) throws Exception { send(to, subj, body, "text/plain; charset=UTF-8"); } @Override public void sendHtml(String to, String subj, String body) throws Exception { send(to, subj, body, "text/html"); } @Override public void sendHtmlWithAttachment(String to, String subj, String body, QrHolder[] attachmentData) throws Exception { MimeMessage message = new MimeMessage(session); message.setFrom(from); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject(subj, "UTF-8"); Multipart multipart = new MimeMultipart(); MimeBodyPart bodyMessagePart = new MimeBodyPart(); bodyMessagePart.setContent(body, "text/html; charset=UTF-8"); multipart.addBodyPart(bodyMessagePart); attachQRs(multipart, attachmentData); attachCSV(multipart, attachmentData); message.setContent(multipart); Transport.send(message); log.trace("Mail to {} was sent. Subj : {}, body : {}", to, subj, body); } private void attachCSV(Multipart multipart, QrHolder[] attachmentData) throws Exception { StringBuilder sb = new StringBuilder(); for (QrHolder qrHolder : attachmentData) { sb.append(qrHolder.token) .append(",") .append(qrHolder.deviceId) .append(",") .append(qrHolder.dashId) .append("\n"); } MimeBodyPart attachmentsPart = new MimeBodyPart(); DataSource source = new ByteArrayDataSource(sb.toString(), "text/csv"); attachmentsPart.setDataHandler(new DataHandler(source)); attachmentsPart.setFileName("tokens.csv"); multipart.addBodyPart(attachmentsPart); } private void attachQRs(Multipart multipart, QrHolder[] attachmentData) throws Exception { for (QrHolder qrHolder : attachmentData) { MimeBodyPart attachmentsPart = new MimeBodyPart(); DataSource source = new ByteArrayDataSource(qrHolder.data, "image/jpeg"); attachmentsPart.setDataHandler(new DataHandler(source)); attachmentsPart.setFileName(qrHolder.makeQRFilename()); multipart.addBodyPart(attachmentsPart); } } private void send(String to, String subj, String body, String contentType) throws Exception { MimeMessage message = new MimeMessage(session); message.setFrom(from); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject(subj, "UTF-8"); message.setContent(body, contentType); Transport.send(message); log.trace("Mail to {} was sent. Subj : {}, body : {}", to, subj, body); } }